package cn.hxsteel.jpart.pager;

import java.util.Map;
import java.util.TreeMap;

/**
 * 帮助分页的类
 * 
 * @since 2013.01.08
 * @author 林麒烽
 */
public class Pager
{
    private static final String PAGE_NO = "#pageNo#";
    
    private int                 pageSize;
    private int                 pageNo;
    private int                 totalRecord;
    private int                 currentPageNo;
    private int                 totalPageNo;
    private String              urlTmp  = "";
    
    public Pager( int pageNo, int totalSize, int pageSize )
    {
	this.pageSize = pageSize;
	this.pageNo = pageNo;
	this.totalRecord = totalSize;
	
	totalPageNo = getTotalPageNo();
    }
    
    /**
     * 创建当前页面的分页对象
     * 
     * @param showNo 要显示在分页组件上的数字个数，只可以是奇数
     */
    public PagerVO create( int showNo, String url )
    {
	createURLTmp( url );
	
	PagerVO pagerVO = new PagerVO();
	pagerVO.setPageSize( pageSize );
	pagerVO.setTotalRecord( totalRecord );
	pagerVO.setCurrentPageNo( pageNo );
	pagerVO.setTotalPageNo( getTotalPageNo() );
	pagerVO.setStartURL( getIndexURl() );
	pagerVO.setEndURL( getEndURL() );
	pagerVO.setPrevURL( getPrevURL() );
	pagerVO.setNextURL( getNextURL() );
	pagerVO.setPageCode( givePageCodeList( showNo ) );
	
	return pagerVO;
    }
    
    /** 创建路径模板 */
    private void createURLTmp( String url )
    {
	if ( url.indexOf( "?" ) > 0 )
	{
	    createURL1( url );
	}
	else
	{
	    createURL2( url );
	}
    }
    
    /**
     * 路径形式： http://www.xxx.com/tmp?p=1&parm=cba | http://www.xxx.com/tmp?parm=cba
     * 
     * @param url
     */
    private void createURL1( String url )
    {
	if ( url.indexOf( "p=" ) > 0 )
	{
	    urlTmp = url.replaceFirst( "p=[0-9]+", "p=" + PAGE_NO );
	}
	else
	{
	    urlTmp = url + "&p=" + PAGE_NO;
	}
    }
    
    /**
     * 路径形式： http://www.xxx.com/tmp/outDepot/1 | http://www.xxx.com/tmp/outDepot/1/parm
     * 
     * @param url
     */
    private void createURL2( String url )
    {
	if ( !url.substring( url.length() - 1 ).equals( "/" ) )
	{
	    url += "/";
	}
	
	if ( url.matches( ".*/[0-9]+/.*" ) )
	{
	    urlTmp = url.replaceFirst( "[0-9]+", PAGE_NO );
	}
	else
	{
	    urlTmp = url + PAGE_NO;
	}
    }
    
    /** 计算页码显示数组 */
    private Map< Integer, String > givePageCodeList( int showNo )
    {
	int totalPageNo = getTotalPageNo();
	// 分页显示数对半，若5就是2，7就是3
	int tag = ( showNo + 1 ) / 2;
	int showPageNo = totalPageNo > showNo ? showNo : totalPageNo;
	int[] shows = new int[ showPageNo ];
	
	for ( int i = 0; i < showPageNo; i++ )
	{
	    // 如果页码不足或者当前页码小于等于中轴数，就全部添加到列表
	    if ( totalPageNo <= showNo || pageNo <= tag )
	    {
		shows[i] = i + 1;
	    }
	    // 如果当前页码加中轴数大于总页数则总是添加末尾5个数字
	    else if ( pageNo + tag > totalPageNo )
	    {
		shows[i] = (int) ( totalPageNo - showNo + i + 1 );
	    }
	    // 其余都是当前页码显示在中轴数上
	    else
	    {
		shows[i] = (int) ( pageNo - tag + 1 + i );
	    }
	}
	
	Map< Integer, String > pageCodeMap = new TreeMap< Integer, String >();
	for ( int i : shows )
	{
	    pageCodeMap.put( i, urlTmp.replace( PAGE_NO, String.valueOf( i ) ) );
	}
	return pageCodeMap;
    }
    
    /**
     * 取总页数.
     */
    private int getTotalPageNo()
    {
	if ( totalRecord % pageSize == 0 )
	    return (int) ( totalRecord / pageSize );
	else
	    return (int) ( totalRecord / pageSize + 1 );
    }
    
    /**
     * 下一页的链接，如果没有返回空字符串
     */
    private String getNextURL()
    {
	if ( currentPageNo < totalPageNo )
	{
	    return urlTmp.replace( PAGE_NO, String.valueOf( currentPageNo + 1 ) );
	}
	else
	{
	    return "";
	}
    }
    
    /**
     * 上一页的链接，如果没有返回空字符串
     */
    private String getPrevURL()
    {
	if ( currentPageNo > 1 )
	{
	    return urlTmp.replace( PAGE_NO, String.valueOf( currentPageNo - 1 ) );
	}
	else
	{
	    return "";
	}
    }
    
    /**
     * 首页链接
     */
    private String getIndexURl()
    {
	return urlTmp.replace( PAGE_NO, String.valueOf( 1 ) );
    }
    
    /**
     * 首页链接
     */
    private String getEndURL()
    {
	return urlTmp.replace( PAGE_NO, String.valueOf( totalPageNo ) );
    }
    
}
